package com.zcc.config;

import at.pollux.thymeleaf.shiro.dialect.ShiroDialect;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.LinkedHashMap;
import java.util.Map;

@Configuration
public class ShiroConfig {
    //第三步
    //ShiroFilterFactoryBean
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(@Qualifier("seManager") DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(securityManager);
        //添加Shiro的内置过滤器
        /*
            anon：无需认证就可以访问
            authc：必须认证了才能访问
            user：必须时有 记住我这个功能 才能访问
            perms：拥有对某个资源的权限才能访问
            roles：拥有某个角色权限才能访问
        */
        //存放认证用的k-v键值对，作为参数
        Map<String,String> filterMap = new LinkedHashMap<>();
        //将指定网址设定过滤范围，而非目录
        //如果用RestFul风格，这里可以设置两个网址为user/toAdd和user/toUpdate
        //直接用通配符即可实现user下的所有网址都被拦截
        filterMap.put("/toUpdate", "perms[user:update]");
        //授权
        //让指定网页需要拥有add权限的user才能访问
        filterMap.put("/toAdd", "perms[user:add]");

        //将拦截器参数传入
        bean.setFilterChainDefinitionMap(filterMap);
        //设置权限不足时的跳转页面
        bean.setUnauthorizedUrl("/unauthorized");

        //设置登录请求页面地址，如果访问需要登录的页面，自动跳转
        bean.setLoginUrl("/toLogin");
        return bean;
    }

    //第二步
    //DefaultWebSecurityManager
    //注解@Qualifier注明了绑定对象，如果有多个相同类型的bean，可以指定路径或者方法名
    @Bean(name = "seManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(@Qualifier("userRealm") UserRealm userRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(userRealm);
        return securityManager;
    }
    //第一步
    //创建realm对象，需要自定义类
    @Bean
    public UserRealm userRealm() {
        return new UserRealm();
    }

    @Bean
    public ShiroDialect getShiroDialect() {
        return new ShiroDialect();
    }
}
